package org.wendu.wdoa.security.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.wendu.wdoa.common.Utils;
import org.wendu.wdoa.common.page.Page;
import org.wendu.wdoa.security.dto.MenuDto;
import org.wendu.wdoa.security.dto.RoleQueryDto;
import org.wendu.wdoa.security.dao.RoleDao;
import org.wendu.wdoa.security.service.RoleService;
import org.wendu.wdoa.security.model.Fun;
import org.wendu.wdoa.security.model.Role;

import java.util.ArrayList;
import java.util.List;

@Service
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Override
    public Page<Role> getRolePage(RoleQueryDto dto) {

        return Utils.getPage(dto,()->roleDao.findRoleList(dto));


    }

    @Override
    public void setRoleFuns(Integer ro_id, Integer[] funIds) {
        roleDao.deleteAllFunsByRoleId(ro_id);//根据角色编号删除表t_rm中的角色权限数据
        roleDao.insertRoleFuns(ro_id,funIds);
    }

    @Override
    public List<MenuDto> getRoleFunList(Integer roleId) {
        List<Fun> funList = roleDao.findRoleFunList(roleId);

        List<MenuDto> mainList = new ArrayList<>();//主菜单集合

        MenuDto currentMainMenu = null;//当前主菜单

        for(Fun fun : funList){
            if(currentMainMenu == null || !fun.getP_id().equals(currentMainMenu.getMenuId())){
                /*
                 * 如果当前主菜单不存在，或者 当前遍历的数据中的父菜单编号与当前主菜单编号不相符
                 * 应当新创建一个当前主菜单，并放入主菜单集合
                 */
                currentMainMenu = new MenuDto();
                currentMainMenu.setMenuId(fun.getP_id());//设置主菜单编号
                currentMainMenu.setMenuName(fun.getP_name());//设置主菜单名称
                currentMainMenu.setChidren(new ArrayList<MenuDto>());//设置子菜单集合
                mainList.add(currentMainMenu);
            }

            //将当前遍历数据中的子菜单部分分离出来，封装到MenuDto对象中，并将该对象放入当前主菜单的子菜单集合中
            MenuDto subMenu = new MenuDto();
            subMenu.setMenuId(fun.getF_id());
            subMenu.setMenuName(fun.getF_name());

            subMenu.setSelected(fun.isSelected());

            currentMainMenu.getChidren().add(subMenu);


        }
        return mainList;
    }
}
